<?php

/**
 * User_LoginController
 * 
 * Логин юзера. 
 * 
 * @package   Basic
 * @author    Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com> 
 */
 
class User_LoginController extends Lord_Controller_Action 
{
	 
/*------------------------------------------------------------------------------*/

    /**
     * Индексный метод.
     * Показывает формочку логина
     */
     
    public function indexAction()
	{
		// показываем форму
		$form = $this->_form();
		$this->view->assign('form', $form); 
		
		$model = new User();
			  
		// валидация   
		if (!empty($_POST)) 
		{     
			if (!$form->isValid($_POST)) 
			{   
				// показываем сообщение об ошибке
				$this->view->assign('err', 'form_fail');
				// получаем невалидные значения, введенные в форму         
				$values = $form->getUnfilteredValues();
				// получаем ошибки
				$errors = $form->getErrors(); 
				// показываем форму с невалидными данными
				return $this->view->assign('form', $this->_form($values, $errors));
			}
		}
		
		/**
		* обрабатываем форму
		*/
		// если к нам что-то пришло из поста
		if ($this->_request->isPost()) 
		{    
			// получаем корректные данные, введенные юзером
			$values = $form->getValues();
			
			/**
			*  настраиваем адаптер для Zend_Auth
			*/             
			// подключаем
			Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
			
			$dbAdapter = Zend_Registry::get('db'); 
			$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
			// задаем имя таблицы с пользователями
			$authAdapter->setTableName('users');
			// указываем поле логина
			$authAdapter->setIdentityColumn('email');
			// указываем поле пароля
			$authAdapter->setCredentialColumn('password');
			// скармливаем мэйл и пароль для проверки
			$authAdapter->setIdentity($values['email']);
			$authAdapter->setCredential(md5($values['password']));
			
			// проводим аутентификацию
			$auth = Zend_Auth::getInstance();
			$result = $auth->authenticate($authAdapter);
			
			/**
			* обрабатываем результат аутентификации
			*/
			if ($result->isValid()) 
			{
				// если юзер поставил фишку "запомните меня, пожалуйста"
				if($values['remember'] == 1)
				{
					// его кука будет храниться указанное кол-во секунд
					Zend_Session::rememberMe(60*60*24*7);
				}
				
				// в случае успешной авторизации
				$data = $authAdapter->getResultRowObject(null, 'password'); 
				// кладем данные пользователя в сессионное хранилище
				$auth->getStorage()->write($data);
				// выводим сообщение об успешной авторизации
				//return $this->view->msg = 'user_login_index_auth_ok';
				$this->_redirect();
				
			} 
			else 
			{
				// выводим сообщение о не прошедшей авторизации
				return $this->view->err = 'user_login_index_fail';
			}
		} 
	}

/*------------------------------------------------------------------------------*/

	/**
	* Иногла показывает Войти/Регистрация, 
	* а иногда - приветствие
	*/
	 
	public function infoboxAction()
	{
		/**
		* все находится в скрипте вида
		*/
	}

/*==============================================================================*/

	/**
	* Приватный метод для построения формы
	* Используется при добавлении и редактировании
	* В качестве аргумента принимает уже заполненые 
	* данные (при редактировании)
	* 
	* @param $data array 
	* @param $errors array
	* @param $action string
	* @return object
	*/
	
	private function _form($data = array(), $errors = array())
	{    
		$form = new Lord_Form_Form();
		$form->setAction( '/' . $this->_moduleName.
						  '/' . $this->_controllerName
						  )
			 ->setMethod('post');  
				  
		// Используемый собственный элемент Lord_Form_Element_Email
		$email = new Zend_Form_Element_Text('email', array(
			'label'       => $this->view->translate('user_login_form_email'),
			'maxlength'   => '50',
			'required'    => true,
			'validators'  => array('EmailAddress'),
		));
		$form->addElement($email);
		
		
		// Password элемент "Пароль". Значение проверяется 
		// валидатором Lord_Validate_Password
		$password = new Zend_Form_Element_Password('password', array(
			'required'    => true,
			'label'       => $this->view->translate('user_login_form_pass'),
			'maxlength'   => '30', 
			'validators'  => array('Password'),
		));
		$form->addElement($password);
        
                
        // Элемент CAPTCHA, защита от спама
        if($this->_helper->config()->captcha_login == 1)
        {
            $captcha = new Zend_Form_Element_Captcha('captcha', array(
                'label' => $this->view->translate("user_login_form_captcha"),
                'captcha' => array(
                    'captcha'   => 'Image', // Тип CAPTCHA
                    'wordLen'   => 4,       // Количество генерируемых символов
                    'width'     => 150,     // Ширина изображения
                    'timeout'   => 120,     // Время жизни сессии хранящей символы
                    'expiration'=> 300,     // Время жизни изображения в файловой системе
                    'font'      => 'design/fonts/arial.ttf',   // Путь к шрифту/ Обязательно отностельный
                    'imgDir'    => 'temporary/captcha/', // Путь к изобр. Обязательно отностельный
                    'imgUrl'    => $this->view->baseUrl . 'temporary/captcha/', // Адрес папки с изображениями
                    'gcFreq'    => 5        // Частота вызова сборщика мусора
                ),
            ));
            $form->addElement($captcha);
        }
		
		
		// Checkbox элемент "Запомнить меня". 
		$remember = new Zend_Form_Element_Checkbox('remember', array(
			'label'       => $this->view->translate('user_login_form_remember'),
			'filters'     => array('Int'), 
		));
		$form->addElement($remember);
			
		// кнопка сабмита
		$form->addElement('submit', 
						 'login', 
						 array('label' => $this->view->translate('user_login_form_submit')));
		
		// ошибки
		$this->_helper->FormErrors($errors, $form);
		
		return $form;
	}   

/*------------------------------------------------------------------------------*/
}
